#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/shm.h>
#include "0_4tell.h"
using namespace std;
//通过管道进行操作

int main()
{

    int shmid;
    if ((shmid = shmget(IPC_PRIVATE, 1024, IPC_CREAT | IPC_EXCL | 0777)) < 0)
    {
        perror("shmget error");
        exit(1);
    }

    pid_t pid;
    init(); //初始化管道
    if ((pid = fork()) < 0)
    {
        perror("fork");
        exit(1);
    }
    else if (pid > 00)
    {
        //共享内存映射
        int *pi = (int *)shmat(shmid,0,0);
        if(pi==(int*)-1){
            perror("shmat error");
        }
        //往共享内存中写入数据

        *pi=100;
        *(pi+1)=200;

        //操作完毕，解除映射
        shmdt(pi);

        notify_pipe();//通知子进程读取数据
        destroy_pipe();

        //回收子进程
        wait(0);
    }
    else if (pid == 0)
    {   
        //子进程阻塞，等待父进程=先往共享内存中写入数据
        wait_pipe();

        //子进程从共享内存中读取数据
        //映射
        int *pi=(int*)shmat(shmid,0,0);
        if(pi==(int*)-1){
            perror("shmat error");
            exit(1);
        }

        std::cout<<*pi<<":"<<*(pi+1)<<std::endl;
        //解除映射
        shmdt(pi);
        //删除共享内存
        shmctl(shmid,IPC_RMID,NULL);

        destroy_pipe(); 

    }

    return 0;
}